﻿/*+========================================================
File:		QuadTree.h
Sumary:	Định nghĩa các lớp cần thiết để xây dựng QuadTree
phục vụ cho việc vẽ và xét va chạm
========================================================+*/
#pragma once

#include "Collision.h"
#include <windows.h>
#include <set>
#include <vector>
#include <map>

class CGameObject;
using namespace std;

/*C+==================================================================
Class:    CQNode

Summary:  Lớp CQNode là các Node trong Quadtree
==================================================================-C*/
class CQNode
{
public:
	/*M+==================================================================
	Method:	    CQNode::CQNode

	Summary:	Phương thức khởi tạo không đối số
	==================================================================-M*/
	CQNode();

	/*M+==================================================================
	Method:	    CQNode::CQNode

	Summary:	Phương thức hủy.
	==================================================================-M*/
	~CQNode();

	/*M+==================================================================
	Method:	    CQNode::~CQNode

	Summary:	Phương thức khởi tạo node thông thường

	Params: id - ID của node
	x1, y1 - Tọa độ góc trên trái của node
	x2, y2 - Tọa độ góc dưới phải của node
	==================================================================-M*/
	CQNode(int id, float x1, float y1, float x2, float y2);

	/*M+==================================================================
	Method:	    CQNode::CQNode

	Summary:	Phương thức khởi tạo node có danh sách đối tượng bên trong

	Params: id - ID của node
			x1, y1 - Tọa độ góc trên trái của node
			x2, y2 - Tọa độ góc dưới phải của node
			idList - Danh sách các id của đối tượng trong Node
			gameObjects - Hash map chứa các đối tượng trong Node
	==================================================================-M*/
	CQNode(int id, float x1, float y1, float x2, float y2, vector<int> idList, map<int, CGameObject*>& gameObjects);

	/*M+==================================================================
	Method:	    CQNode::AddNodeLT

	Summary:	Phương thức thêm node LT

	Params:		lt - node LT
	==================================================================-M*/
	void AddNodeLT(CQNode* lt);

	/*M+==================================================================
	Method:	    CQNode::AddNodeLT

	Summary:	Phương thức thêm node RT

	Params:		rt - node RT
	==================================================================-M*/
	void AddNodeRT(CQNode* rt);

	/*M+==================================================================
	Method:	    CQNode::AddNodeLB

	Summary:	Phương thức thêm node LB

	Params:		lb - node LB
	==================================================================-M*/
	void AddNodeLB(CQNode* lb);

	/*M+==================================================================
	Method:	    CQNode::AddNodeRB

	Summary:	Phương thức thêm node RB

	Params:		rb - node RB
	==================================================================-M*/
	void AddNodeRB(CQNode* rb);

	/*M+==================================================================
	Method:	    CQNode::GetObjectInVP

	Summary:	Phương thức lấy các đối tượng có thể nằm bên trong View Port

	Params:		vpBox - Box của viewport
	==================================================================-M*/
	void GetObjectsInVP(Box vpBox, vector<CGameObject*>* listGameObject);

private:
	//ID của QuadTree Node
	int m_nId;
	//Tọa độ trên trái của Node
	float m_x1;
	float m_y1;
	//Tọa độ dưới phải của Node
	float m_x2;
	float m_y2;
	//Danh sách các đối tượng trong Node
	vector<CGameObject*> m_aGameObject;
	//Các node con của node hiện tại
	CQNode* m_pLT;
	CQNode* m_pRT;
	CQNode* m_pLB;
	CQNode* m_pRB;
};
